//
//  ViewController.swift
//  0301-testgetter&setter
//
//  Created by 王柯佳 on 16/3/1.
//  Copyright © 2016年 wkjsos. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    /*懒加载写法1*/
    lazy var dataList : [String] = {
        return ["123"]
    }()
    /*懒加载写法2*/
    lazy var dataList2 :[String] = ["1112","2222"]
    
    var finished : ((data : String) -> () )?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    func swiftFunc2(){
        /*3. swift方式解决循环引用问题*/
        
        testCricleReference {[unowned self] (data) -> () in
            //  正常调用本页面的view可以省去self，不过因为闭包和block只是保存代码，在未来的某些不确定时刻执行，所以需要带上self。但此时不会发生循环引用
            print("哦，好开心拿到数据了呢 \(data) \(self.view)")
            // 这种方式，如果self在某些时刻为空，则会直接崩溃
        }
    }
    
    
    
    func swiftFunc1(){
        /*2. swift方式解决循环引用问题*/

        testCricleReference {[weak self] (data) -> () in
            //  正常调用本页面的view可以省去self，不过因为闭包和block只是保存代码，在未来的某些不确定时刻执行，所以需要带上self。但此时不会发生循环引用
            print("哦，好开心拿到数据了呢 \(data) \(self?.view)")
            // 使用weakSelf的时候因为是弱引用，可能为空，所以需要插入！或者？
        }
    }
    
    
    
    func ocFunc(){
        /*1. oc方式解决循环引用问题*/
        weak var weakSelf = self;
        
        testCricleReference { (data) -> () in
            //  正常调用本页面的view可以省去self，不过因为闭包和block只是保存代码，在未来的某些不确定时刻执行，所以需要带上self。但此时不会发生循环引用
            print("哦，好开心拿到数据了呢 \(data) \(weakSelf?.view)")
            // 使用weakSelf的时候因为是弱引用，可能为空，所以需要插入！或者？
        }
    }
    
    
    
    
    func testCricleReference(finish : (data : String) -> ()){
        
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            
            print("开启了一个耗时操作")
            
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                
                // 回调主线程
//                finish(data: "嘟嘟")
                self.finished = finish
                
            })
        }
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        // 因为该闭包可能为空，需要进行强行解包.
        //  有两种方式，一种是插入！，但这种做法，在为空的时候会直接崩溃
        // 使用? 的好处是为空的时候什么都不做
        self.finished?(data: "啦啦啦啦")
    }
    
    
    func testGetterSetter(){
        let person = Person()
        
        person.email = "931625530@qq.com"
        
        person.name = "wkj"
        
        person.password = "123456"
        
        print("\(person.name)   \(person.email) \(person.password)")
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

